Applicative Styleの練習
問題
code:hs
do
pure (max a b)
code:hs
do
a <- Just 1
b <- Just 2
pure (a+b)
code:hs
do
a <- Just 1
b <- Just 2
c <- Just 3
pure $ add3 a b c
--
add3 :: Int -> Int -> Int -> Int
add3 n1 n2 n3 = n1 + n2 + n3
code:hs
pure (+) <*> Right 10 <*> Right 20
doではなくpureを使ったものの書き換え
code:hs
do
x <- Just 0
pure (x:xs)
code:hs
do
x <- Just 5
回答
code:hs
最も基本的な書き換え
2つの引数を取る普通の関数に、2つのアプリカティブ値を適用している
code:hs
(+) <$> Just 1 <*> Just 2
記号だとしても同じ
code:hs
add3 <$> Just 1 <*> Just 2 <*> Just 3
引数の数が増えても同じ
<*>で連結していくだけ
code:hs
(+) <$> Right 10 <*> Right 20
pureで持ち上げてから適用するのではなく、そのまま<$>を使えば良い
code:hs
(:) <$> Just 0 <*> Just 1,2,3 consでも同じ
code:hs
(:[]) <$> Just 5
いったん以下を経由すればわかりやすい?
code:hs
do
x <- Just 5
pure (x:[])
ただ、ここで(:) x []ではなく、(:[])自体を関数と見なすことがポイント
前者として捉えると以下のようになってしまう
code:hs
(:) <$> Just 5 <*> Just []